package com.saver.view.item;

import android.app.ActionBar;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.saver.R;
import com.saver.core.persistence.DBManager;
import com.saver.core.persistence.TransaccionSQLite;
import com.saver.core.util.Constantes;
import com.saver.core.util.DateUtil;
import com.saver.view.gui.FragmentSupport;
import com.saver.view.model.FragmentModel;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class ParentViewPagerFragment extends FragmentSupport {

    public static final String TAG = "ParentViewPagerFragment";

    private ViewPager viewPager;
    private String fecha;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_parent_viewpager, container, false);
        viewPager = (ViewPager) root.findViewById(R.id.viewPager);
        Bundle b = getArguments();
        FragmentModel model = (FragmentModel) b.get("args");
        MyAdapter adapter = new MyAdapter(getChildFragmentManager(), model);
        viewPager.setAdapter(adapter);
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                Log.d(TAG, "position: " + position);
                setTabActual(position);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });
        setTabActual(Constantes.TAB_DEFAULT);
        return root;
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: tabActual = " + getTabActual());

        Bundle b = getArguments();
        FragmentModel model = (FragmentModel) b.get("args");
        int tipoGrafico = model.getTipoGrafico();
        Log.d(TAG, "tipoGrafico: " + tipoGrafico);

        List<String> titulos = getTotalTabs(model.getTipoConsulta(), tipoGrafico, model.getCategoria());
        model.setTitulos(titulos);

        if (fecha != null || model.getReferencia() != null) {
            try {
                int indice = obtenerIndiceTitulo(model, tipoGrafico, (fecha != null) ? fecha : model.getReferencia());
                setTabActual(indice);
            } catch (Exception e) {
                setTabActual(titulos.size() - 1);
            }
        } else if (getTabActual() == Constantes.TAB_DEFAULT) {
            setTabActual(titulos.size() - 1);
        }
        MyAdapter adapter = new MyAdapter(getChildFragmentManager(), model);
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(getTabActual());
    }

    @Override
    public void refresh(String fecha) {
        this.fecha = fecha;
        super.refresh(fecha);
    }

    private int obtenerIndiceTitulo(FragmentModel model, int tipoGrafico, String referencia) throws Exception {
        int caseValue = model.getTipoConsulta() * 10 + tipoGrafico;
        Date fecha = DateUtil.FORMATO_GENERAL.parse(referencia);
        //18/05/2015
        switch (caseValue) {
            case 1://CONSULTA_X_ANIO + TIPO_GRAFICO_BAR
                return 0;
            case 0://CONSULTA_X_ANIO + TIPO_GRAFICO_LIST
            case 2://CONSULTA_X_ANIO + TIPO_GRAFICO_PIE
            case 11://CONSULTA_X_MES + TIPO_GRAFICO_BAR
                String year = DateUtil.FORMATO_SQLITE_SOLO_ANIO.format(fecha);
                return model.getTitulos().indexOf(year);
            case 12://CONSULTA_X_MES + TIPO_GRAFICO_PIE
            case 10://CONSULTA_X_MES + TIPO_GRAFICO_LIST
            case 21://CONSULTA_X_DIA + TIPO_GRAFICO_BAR
                String month = DateUtil.FORMATO_SQLITE_A_MES.format(fecha);
                return model.getTitulos().indexOf(month);
            case 22://CONSULTA_X_DIA + TIPO_GRAFICO_PIE
            case 20://CONSULTA_X_DIA + TIPO_GRAFICO_LIST
                String day = DateUtil.FORMATO_SQLITE.format(fecha);
                return model.getTitulos().indexOf(day);
        }
        return 0;
    }

    private List<String> getTotalTabs(int tipoConsulta, int tipoGrafico, Integer categoria) {
        TransaccionSQLite transaccionSQLite = DBManager.transaccionSQLite();
        int caseValue = tipoConsulta * 10 + tipoGrafico;
        List<String> tabs = new ArrayList<String>();
        String titulo = DateUtil.FORMATO_SQLITE.format(new Date());

        switch (caseValue) {
            case 1://CONSULTA_X_ANIO + TIPO_GRAFICO_BAR
                tabs.add(titulo.substring(0, 4));
                break;
            case 0://CONSULTA_X_ANIO + TIPO_GRAFICO_LIST
            case 2://CONSULTA_X_ANIO + TIPO_GRAFICO_PIE
            case 11://CONSULTA_X_MES + TIPO_GRAFICO_BAR
                tabs = transaccionSQLite.getTotalTabs(Constantes.CONSULTA_X_ANIO, categoria);
                if (tabs.isEmpty()) {
                    tabs.add(titulo.substring(0, 4));
                }
                break;
            case 12://CONSULTA_X_MES + TIPO_GRAFICO_PIE
            case 10://CONSULTA_X_MES + TIPO_GRAFICO_LIST
            case 21://CONSULTA_X_DIA + TIPO_GRAFICO_BAR
                tabs = transaccionSQLite.getTotalTabs(Constantes.CONSULTA_X_MES, categoria);
                if (tabs.isEmpty()) {
                    tabs.add(titulo.substring(0, 7));
                }
                break;
            case 22://CONSULTA_X_DIA + TIPO_GRAFICO_PIE
            case 20://CONSULTA_X_DIA + TIPO_GRAFICO_LIST
                tabs = transaccionSQLite.getTotalTabs(Constantes.CONSULTA_X_DIA, categoria);
                if (tabs.isEmpty()) {
                    tabs.add(titulo);
                }
                break;
        }
        return tabs;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        ActionBar actionBar = getActivity().getActionBar();
        if (actionBar != null) {
            outState.putInt("tab", actionBar.getSelectedNavigationIndex());
        }
    }

    public static class MyAdapter extends FragmentStatePagerAdapter {

        FragmentModel model;

        public MyAdapter(FragmentManager fm, FragmentModel model) {
            super(fm);
            this.model = model;
            Log.d(TAG, "inciando MyAdapter");
        }

        @Override
        public int getCount() {
            if (model.getTitulos() == null) {
                return 0;
            }
            return model.getTitulos().size();
        }

        @Override
        public Fragment getItem(int position) {
            Log.d(TAG, "getItem");

            String currentTitle = getPageTitle(position).toString();
            Calendar calendar = Calendar.getInstance(new Locale("es", "pe"));
            try {
                switch (model.getTipoConsulta()) {
                    case Constantes.CONSULTA_X_ANIO:
                        switch (model.getTipoGrafico()) {
                            case Constantes.TIPO_GRAFICO_BAR:
                                break;
                            case Constantes.TIPO_GRAFICO_PIE:
                            case Constantes.TIPO_GRAFICO_LIST:
                                calendar.setTime(DateUtil.FORMATO_SQLITE_SOLO_ANIO.parse(currentTitle.toLowerCase()));
                                break;
                        }
                        break;
                    case Constantes.CONSULTA_X_MES:
                        switch (model.getTipoGrafico()) {
                            case Constantes.TIPO_GRAFICO_BAR:
                                calendar.setTime(DateUtil.FORMATO_SQLITE_SOLO_ANIO.parse(currentTitle.toLowerCase()));
                                break;
                            case Constantes.TIPO_GRAFICO_PIE:
                            case Constantes.TIPO_GRAFICO_LIST:
                                calendar.setTime(DateUtil.FORMATO_TITULO_MES.parse(currentTitle.toLowerCase()));
                                break;
                        }
                        break;
                    case Constantes.CONSULTA_X_DIA:
                        switch (model.getTipoGrafico()) {
                            case Constantes.TIPO_GRAFICO_BAR:
                                calendar.setTime(DateUtil.FORMATO_TITULO_MES.parse(currentTitle.toLowerCase()));
                                break;
                            case Constantes.TIPO_GRAFICO_PIE:
                            case Constantes.TIPO_GRAFICO_LIST:
                                calendar.setTime(DateUtil.FORMATO_TITULO_DIA.parse(currentTitle.toLowerCase()));
                                break;
                        }
                        break;
                }
            } catch (Exception e) {
                Log.e(TAG, "algún error");
            }

            Bundle args = new Bundle();
            FragmentModel modelArgs = new FragmentModel();
            modelArgs.setTipoConsulta(model.getTipoConsulta());
            modelArgs.setCalendar(calendar);
            modelArgs.setCategoria(model.getCategoria());
            Fragment charItem = null;
            args.putSerializable("args", modelArgs);

            int tipoGrafico = model.getTipoGrafico();
            Log.d(TAG, "tipoGrafico: " + tipoGrafico);

            if (tipoGrafico == Constantes.TIPO_GRAFICO_BAR) {
                Log.d(TAG, "TIPO_GRAFICO_BAR");
                charItem = BarChartFragment.instanceOf(args);

            } else if (tipoGrafico == Constantes.TIPO_GRAFICO_PIE) {
                Log.d(TAG, "TIPO_GRAFICO_PIE");
                charItem = PieChartFragment.instanceOf(args);

            } else if (tipoGrafico == Constantes.TIPO_GRAFICO_LIST) {
                Log.d(TAG, "TIPO_GRAFICO_LIST");
                charItem = ListRegistroFragment.instanceOf(args);
            }
            return charItem;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Log.d(TAG, "getPageTitle");

            String title = model.getTitulos().get(position);
            try {
                switch (model.getTipoConsulta()) {
                    case Constantes.CONSULTA_X_ANIO:
                        switch (model.getTipoGrafico()) {
                            case Constantes.TIPO_GRAFICO_BAR:
                                title = "A\u00F1os";
                                break;
                            case Constantes.TIPO_GRAFICO_PIE:
                            case Constantes.TIPO_GRAFICO_LIST:
                                //2015
                                break;
                        }
                        break;
                    case Constantes.CONSULTA_X_MES:
                        switch (model.getTipoGrafico()) {
                            case Constantes.TIPO_GRAFICO_BAR:
                                //2015
                                break;
                            case Constantes.TIPO_GRAFICO_PIE:
                            case Constantes.TIPO_GRAFICO_LIST:
                                //2015-04
                                title = DateUtil.FORMATO_TITULO_MES.format(DateUtil.FORMATO_SQLITE_A_MES.parse(title));
                                break;
                        }
                        break;
                    case Constantes.CONSULTA_X_DIA:
                        switch (model.getTipoGrafico()) {
                            case Constantes.TIPO_GRAFICO_BAR:
                                //2015-05
                                title = DateUtil.FORMATO_TITULO_MES.format(DateUtil.FORMATO_SQLITE_A_MES.parse(title));
                                break;
                            case Constantes.TIPO_GRAFICO_PIE:
                            case Constantes.TIPO_GRAFICO_LIST:
                                //2015-05-12
                                title = DateUtil.FORMATO_TITULO_DIA.format(DateUtil.FORMATO_SQLITE.parse(title));
                                break;
                        }
                        break;
                }
            } catch (Exception e) {
                Log.e(TAG, "algún error");
            }
            return title.toUpperCase();
        }
    }
}
